<script setup lang="ts">
import { onHide, onLaunch, onShow } from "@dcloudio/uni-app";
import RootStore from "@xkit-yx/im-store-v2";
import V2NIM, { V2NIMConst } from "nim-web-sdk-ng/dist/v2/NIM_UNIAPP_SDK";
import apiUser from "@/api/user";
import { usePageAuth } from "@/hooks/usePageAuth";
import { tabbarStore } from "@/layouts/fg-tabbar/tabbar";
import { useUserStore } from "@/store/user";
import { isInitialized, updateActivityTime, ensureSessionValid } from "@/utils/nimService";
import { handleWxSystemError } from "@/utils/wxErrorHandler";
import "abortcontroller-polyfill/dist/abortcontroller-polyfill-only";

// 全局标志，用于跟踪NIM SDK是否已初始化
let nimSDKInitialized = false;

// 预初始化NIM SDK和Store（不登录，只初始化基础组件）
async function preInitializeNIMSDK(): Promise<boolean> {
  try {
    // 如果已经初始化过，直接返回
    if (nimSDKInitialized && uni.$UIKitNIM && uni.$UIKitStore) {
      console.log("NIM SDK已经预初始化，无需重复操作");
      return true;
    }

    console.log("开始预初始化NIM SDK和Store...");

    // 获取基础配置信息用于SDK初始化
    const userStore = useUserStore();
    const deviceId = userStore.getSystemInfo()?.deviceId;

    if (!deviceId) {
      console.error("无法获取设备ID，跳过NIM SDK预初始化");
      return false;
    }

    // 获取appkey等基础配置
    let appkey = "";
    try {
      const res = await apiUser.customerGuest({
        instanceId: "202508041418101296925888",
        webUuid: deviceId,
      });

      if (res && res.result) {
        appkey = res.result.imAccountToken.appkey;
        // 可以先保存配置，供后续使用
        uni.setStorageSync("imOptions", res.result);
        console.log("已获取NIM配置信息");
      }
      else {
        throw new Error("获取NIM配置失败");
      }
    }
    catch (error) {
      console.error("获取NIM配置出错:", error);
      // 配置获取失败时，使用默认配置或跳过预初始化
      return false;
    }

    // 初始化NIM SDK
    const isWxApp = uni.getSystemInfoSync().uniPlatform === "mp-weixin";

    try {
      console.log("正在初始化NIM SDK...");
      const nim = (uni.$UIKitNIM = V2NIM.getInstance(
        {
          appkey,
          needReconnect: true,
          debugLevel: "debug",
          apiVersion: "v2",
        },
        {
          V2NIMLoginServiceConfig: {
            lbsUrls: isWxApp
              ? ["https://lbs.netease.im/lbs/wxwebconf.jsp"]
              : ["https://lbs.netease.im/lbs/webconf.jsp"],
            linkUrl: isWxApp ? "wlnimsc0.netease.im" : "weblink.netease.im",
            isFixedDeviceId: true,
          },
        },
      ));

      if (!nim) {
        throw new Error("NIM SDK创建失败");
      }

      console.log("NIM SDK初始化成功");
    }
    catch (error) {
      console.error("NIM SDK初始化失败:", error);
      return false;
    }

    // 初始化Store
    try {
      console.log("正在初始化UIKit Store...");
      const store = (uni.$UIKitStore = new RootStore(
        uni.$UIKitNIM as any,
        {
          addFriendNeedVerify: false,
          p2pMsgReceiptVisible: true,
          teamMsgReceiptVisible: true,
          teamAgreeMode: V2NIMConst.V2NIMTeamAgreeMode.V2NIM_TEAM_AGREE_MODE_NO_AUTH as any,
          sendMsgBefore: async (options) => {
            console.log("发送消息前的拦截器:", options);
            const pushConfig = {};
            return { ...options, pushConfig };
          },
        },
        "UniApp",
      ));

      if (!store) {
        throw new Error("UIKit Store创建失败");
      }

      console.log("UIKit Store初始化成功");
    }
    catch (error) {
      console.error("UIKit Store初始化失败:", error);
      return false;
    }

    // 设置初始化完成标志
    nimSDKInitialized = true;
    console.log("NIM SDK和Store预初始化完成");
    return true;
  }
  catch (error) {
    console.error("预初始化NIM SDK出错:", error);
    nimSDKInitialized = false;
    return false;
  }
}

onLaunch(async () => {
  console.log("App Launch");

  // 挂载会话检查函数到全局
  uni.ensureSessionValid = ensureSessionValid;

  // 应用启动时，确保tabbar状态正确
  tabbarStore.resetState();

  // 预初始化NIM SDK和Store，但不登录
  console.log("应用启动，开始预初始化NIM组件...");

  try {
    const preInitialized = await preInitializeNIMSDK();
    if (preInitialized) {
      console.log("NIM组件预初始化成功，等待用户触发登录");
    }
    else {
      console.warn("NIM组件预初始化失败，将在用户需要时重试");
    }
  }
  catch (error) {
    console.error("NIM组件预初始化异常:", error);
  }

  // 设置全局用户活动监听（转发到聊天活动）
  uni.$on("userActivity", () => {
    // 只有在NIM服务已初始化时才更新活动时间
    if (isInitialized()) {
      updateActivityTime();
      // 同时触发聊天活动事件
      uni.$emit("chatActivity");
    }
  });

  // 设置页面显示监听 - 但不影响聊天会话
  uni.$on("pageShow", () => {
    // 页面显示时触发应用级事件，但不更新聊天活动时间
    // 聊天活动时间只能通过聊天页面内的真实操作更新
    console.log("页面显示事件，但不影响聊天会话计时");
  });
});

onShow(() => {
  console.log("App Show");

  // 页面权限检查
  usePageAuth();

  // 应用重新进入时，确保tabbar状态正确
  tabbarStore.resetState();

  // 触发页面显示事件
  uni.$emit("pageShow");

  // 如果NIM SDK未预初始化，尝试重新初始化
  if (!nimSDKInitialized || !uni.$UIKitNIM || !uni.$UIKitStore) {
    console.log("检测到NIM组件未初始化，尝试重新初始化");
    preInitializeNIMSDK().catch((error) => {
      console.error("重新初始化NIM组件失败:", error);
    });
  }
});

onHide(() => {
  console.log("App Hide");

  // 应用进入后台时，如果NIM已登录，可以保持连接但更新状态
  if (isInitialized()) {
    console.log("应用进入后台，NIM服务保持运行");
  }
});
</script>

<style lang="scss">
swiper,
scroll-view {
  flex: 1;
  height: 100%;
  overflow: hidden;
}

image {
  width: 100%;
  height: 100%;
  vertical-align: middle;
}
</style>
